package org.linotte.tweak;

import java.awt.DisplayMode;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.io.File;
import java.math.BigDecimal;

import javax.swing.ImageIcon;
import javax.swing.JFrame;

import org.alize.kernel.AKPatrol;
import org.alize.kernel.AKRuntime;
import org.linotte.frame.latoile.LaToileJDialog;
import org.linotte.greffons.externe.Greffon;
import org.linotte.greffons.externe.Greffon.DocumentationHTML;
import org.linotte.moteur.xml.alize.kernel.RuntimeContext;

import com.sun.awt.AWTUtilities;
import com.sun.awt.AWTUtilities.Translucency;

@DocumentationHTML("" + "Le greffon <i>Tweak</i> est une espèce offrant la possibilité de modifier l'environnement Linotte.<br>"
		+ "<u>Les méthodes fonctionnelles proposées par l'espèce Tweak sont:</u><br>" + "<ul>" + "<li>tweak.changericônetoile(chemin&lt;texte>) : Change l'icône de la toile</li>"
		+ "<li>tweak.changericône(chemin&lt;texte>) : Change l'icône de la barre des tâches</li>"
		+ "<li>tweak.transparencetoile(valeur&lt;nombre>) : Change le niveau de transparence de la toile</li>" + "<li>tweak.toileinvisible() : Cache le fond de la toile</li>"
		+ "<li>tweak.vidermémoire() : Ne pas utiliser</li>" + "<li>tweak.changerésolution(largeur&lt;nombre>,hauteur&lt;nombre>) : Change la résolution de l'écran</li>" + "</ul>")
public class Tweak extends Greffon {

	@Slot(nom = "changericônetoile")
	public boolean changericonetoile(String icone) throws GreffonException {
		try {
			for (AKRuntime runtime : AKPatrol.runtimes) {
				RuntimeContext context = (RuntimeContext) runtime.getContext();
				LaToileJDialog toile = (LaToileJDialog) context.getLibrairie().getToile();
				String chemin = getRessourceManager().analyserChemin(icone);
				File file = new File(chemin);
				toile.setIconImage(new ImageIcon(file.toURI().toURL()).getImage());
			}
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}

	@Slot(nom = "changericône")
	public boolean changericone(String icone) throws GreffonException {
		try {
			for (AKRuntime runtime : AKPatrol.runtimes) {
				RuntimeContext context = (RuntimeContext) runtime.getContext();
				LaToileJDialog toile = (LaToileJDialog) context.getLibrairie().getToile();
				String chemin = getRessourceManager().analyserChemin(icone);
				File file = new File(chemin);
				if (toile.getFrameParent() != null)
					((JFrame) toile.getFrameParent()).setIconImage(new ImageIcon(file.toURI().toURL()).getImage());
			}
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}

	@Slot
	public boolean transparencetoile(BigDecimal alpha) throws GreffonException {
		try {
			for (AKRuntime runtime : AKPatrol.runtimes) {
				RuntimeContext context = (RuntimeContext) runtime.getContext();
				LaToileJDialog toile = (LaToileJDialog) context.getLibrairie().getToile();

				try {
					// On vérifie d'abord la présence de la classe AWTUtilities :
					Class.forName("com.sun.awt.AWTUtilities");
					// On vérifie que le système permettent ces effets :
					if (AWTUtilities.isTranslucencySupported(Translucency.PERPIXEL_TRANSLUCENT) && AWTUtilities.isTranslucencyCapable(toile.getGraphicsConfiguration())) {
						// Puis on rend la fenêtre non-opaque :
						AWTUtilities.setWindowOpacity(toile, alpha.floatValue() / 100);
					}
				} catch (ClassNotFoundException e) {
					// AWTUtilities n'existe pas pour cette JVM : on ne fait rien !
					e.printStackTrace();
				}

			}
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}

	@Slot
	public boolean toileinvisible() throws GreffonException {
		try {
			for (AKRuntime runtime : AKPatrol.runtimes) {
				RuntimeContext context = (RuntimeContext) runtime.getContext();
				LaToileJDialog toile = (LaToileJDialog) context.getLibrairie().getToile();
				toile.getPanelLaToile().activeTranslucencyCapable();
			}
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}

	@Slot(nom = "vidermémoire")
	public boolean vidermemoire() throws GreffonException {
		try {
			for (AKRuntime runtime : AKPatrol.runtimes) {
				RuntimeContext context = (RuntimeContext) runtime.getContext();
				context.getLibrairie().getToile().getPanelLaToile().effacer();
				context.getLibrairie().vider();
			}
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}

	@Slot(nom = "changerésolution")
	public boolean changeresolution(int largeur, int hauteur) throws GreffonException {
		try {
			GraphicsDevice device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
			DisplayMode dm = device.getDisplayMode();
			DisplayMode newDM = new DisplayMode(largeur, hauteur, dm.getBitDepth(), dm.getRefreshRate());
			device.setDisplayMode(newDM);
		} catch (Exception e) {
			throw new GreffonException(e.getMessage());
		}
		return true;
	}
}
